package algo_lignes_sites.params.param_component;

import algo_lignes_sites.params.ParamsManager_ls;
import algo_lignes_sites.params.Params_ls;
import algo_lignes_sites.params.objects.contraintesgeom.ContrainteGeomNode;
import commons.params.param_component.AbstractParamComponent_table;
import commons.utils.Utils;
import java.util.ArrayList;
import javax.swing.JComponent;

public class ParamComponent_table_ContrainteGeomNode extends AbstractParamComponent_table{

	public ParamComponent_table_ContrainteGeomNode(String name, ParamsManager_ls paramsManager, JComponent component, boolean bCanBeNull) {
		super(name, paramsManager, component, bCanBeNull,
				new String[] {"Nom catégorie", "Diametre (mm)", "Espace (mm)", "ZS", "ZC", "ZIT", "ZIN", "Commentaire"},
				new String[] {"nomCategorie", "diametre",  "espace", "zoneSimplif", "zonceConnexite", "influenceTotale", "influenceNulle", "commentaire"},
				new Class[] {String.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class});
		
		// Taille des colonnes : on met des petites colonnes pour les ZS, ZC, ZIT et ZIN et une grande pour les commentaires
		Integer[] colSize = new Integer[NB_COL];
		colSize[0] = 150;
		colSize[1] = 90;
		colSize[2] = 90;
		colSize[3] = 40;
		colSize[4] = 40;
		colSize[5] = 40;
		colSize[6] = 40;
		colSize[7] = 400; // colonne de commentaire
		setColumnSize(colSize);
	}

	// appelée à la fin par ParamsManager afin de constituer le Params
	// l'argument params permet de retrouver certains objets déjà lus, via leur nom
	//  (les catégories, en l'occurence)
	// les valeurs par defaut static de ContrainteGeomNode doivent avoir été renseignée avant !
	public ArrayList<ContrainteGeomNode> getVContrainteGeomNode(Params_ls params) {
		ArrayList<ContrainteGeomNode> vCGN = new ArrayList<ContrainteGeomNode>();

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);
			
			String nomCat = (String) rowData[0]; assert(nomCat!=null); // ne peut etre null
			
			String s_diametre_mm = (String) rowData[1]; if (s_diametre_mm==null) s_diametre_mm="";
			String s_espace_mm = (String) rowData[2]; if (s_espace_mm==null) s_espace_mm="";
			String s_zs = (String) rowData[3]; if (s_zs==null) s_zs="";
			String s_zc = (String) rowData[4]; if (s_zc==null) s_zc="";
			String s_zit = (String) rowData[5]; if (s_zit==null) s_zit="";
			String s_zin = (String) rowData[6]; if (s_zin==null) s_zin="";
			
			double diametre_mm = s_diametre_mm.isEmpty() ? Double.NaN : Double.parseDouble(s_diametre_mm);
			double espace_mm = s_espace_mm.isEmpty() ? Double.NaN : Double.parseDouble(s_espace_mm);
			double zs = s_zs.isEmpty() ? Double.NaN : Double.parseDouble(s_zs);
			double zc = s_zc.isEmpty() ? Double.NaN : Double.parseDouble(s_zc);
			double zit = s_zit.isEmpty() ? Double.NaN : Double.parseDouble(s_zit);
			double zin = s_zin.isEmpty() ? Double.NaN : Double.parseDouble(s_zin);
			
			ContrainteGeomNode rg = new ContrainteGeomNode(params.getCategoryNodeByName(nomCat), diametre_mm, espace_mm, zs, zc, zit, zin);
			vCGN.add(rg);
		}
		return vCGN;
	}

	// l'appelant doit verifier qu'il n'y a pas d'erreur dans cette table ! (pour la conversion string->double de l'influence nulle)
//	public double getMinInfluenceNulle() {
//		double minInfluenceNulle = Double.POSITIVE_INFINITY;
//		for (int numRow = 0; numRow <data.size() ; numRow++) {
//			Object[] rowData = data.get(numRow);
//			double influenceNulle = Double.parseDouble((String) rowData[4]);
//			if (influenceNulle < minInfluenceNulle)
//				minInfluenceNulle = influenceNulle;
//		}
//		return minInfluenceNulle;
//	}

	//**************************************************************************
	//**************************************************************************

	@Override
	public void makeStandardControls() {
		assert possibleValues[0] != null;

		// La table ne peut être vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des contraintes", true);
			return;
		}

		beginControls();

		// Parcourt des row
		for (int numRow = 0; numRow<data.size() ; numRow++) {
			
			String value;
			
			//***** Nom de la catégorie, obligatoire et sans doublon
			basicCheck_NoDoublon(numRow, 0);

			//***** Diametre des noeuds (peut être vide)
			value = (String) data.get(numRow)[1];
			if ( value!=null && !value.isEmpty() )
				basicCheck_FloatStrictPos(numRow, 1);

			//***** Espace autour (peut être vide)
			value = (String) data.get(numRow)[2];
			if ( value!=null && !value.isEmpty() )
				basicCheck_FloatStrictPos(numRow, 2);

			
			//***** ZS (peut être vide)
			value = (String) data.get(numRow)[3];
			if ( value!=null && !value.isEmpty() )
				basicCheck_FloatStrictPos(numRow, 3);
			
			//***** ZC (peut être vide)
			value = (String) data.get(numRow)[4];
			if ( value!=null && !value.isEmpty() )
				basicCheck_FloatStrictPos(numRow, 4);
			
			//***** Influence totale (peut être vide)
			value = (String) data.get(numRow)[5];
			if ( value!=null && !value.isEmpty() )
				basicCheck_FloatPos(numRow, 5);
			
			//***** Influence nulle (peut être vide)
			value = (String) data.get(numRow)[6];
			if ( value!=null && !value.isEmpty() ) {
				basicCheck_FloatStrictPos(numRow, 6);

				// Influence nulle > 1
				String valInfluenceNulle  = (String) data.get(numRow)[6];
				if (Utils.isFloat(valInfluenceNulle) &&
						Double.parseDouble(valInfluenceNulle)<=1)
					addError(numRow, 4, "Le facteur d'influence nulle doit être > 1");
			}
		}
		finaliseControls();
	}

}
